﻿/*
 * ztypes.h
 *
 *  Created on: 2012-7-24
 *      Author: Fifi Lyu
 */

#ifndef INCLUDE_ZPSOE_ZTYPES_H_
#define INCLUDE_ZPSOE_ZTYPES_H_

#include <stdint.h>
#include <string>

using std::string;

// int
#ifdef PLATFORM_WIN32
    typedef __int16 int16_t;
    typedef __int32 int32_t;
    typedef __int64 int64_t;
    typedef unsigned __int16 uint16_t;
    typedef unsigned __int32 uint32_t;
    typedef unsigned __int64 uint64_t;
#endif

// for size_t, ssize_t
#ifdef PLATFORM_WIN32
    #if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED)
        typedef intptr_t ssize_t;
        # define _SSIZE_T_
        # define _SSIZE_T_DEFINED
    #endif
#else
    #include <sys/types.h>
#endif

typedef uint64_t byte_t;
typedef double uint_t;
typedef uint_t kib_t;
typedef uint_t mib_t;
typedef uint_t gib_t;
typedef uint_t tib_t;
typedef uint_t pib_t;
typedef uint_t kb_t;
typedef uint_t mb_t;
typedef uint_t gb_t;
typedef uint_t tb_t;
typedef uint_t pb_t;

// 文件类型
typedef enum {
    FT_FILE,
    FT_DIR,
    FT_ALL
} file_type_t;

// 比较结果
typedef enum {
    CMP_LESS = -1,
    CMP_EQUAL,  // 0
    CMP_GREATER  // 1
} cmp_t;

// 3态bool
typedef enum {
    TB_INDETERMINATE = -1,
    TB_FALSE,  // 0，等于 false
    TB_TRUE  // 1，等于 true
} tri_bool_t;

typedef enum {
    LOS_FILE,
    LOS_STDOUT,
    LOS_STDERR
} log_output_stream_t;

typedef enum {
    LOG_TRACE,
    LOG_DEBUG,
    LOG_INFO,
    LOG_WARN,
    LOG_ERROR,
    LOG_FATAL,
    LOG_OFF
} log_level_t;

typedef struct {
    log_level_t level;
    log_output_stream_t output_to;
    size_t max_byte;
    string path;
} log_config_t;

// 二进制乘数词头枚举，不支持EiB、ZiB和YiB
// 国际单位制词头枚举，不支持EB、ZB和YB
typedef enum {
    SIZE_Byte = 0,  // byte
    // 二进制乘数词头 {
    SIZE_KiB,  // kibibyte,
    SIZE_MiB,  // mebibyte,
    SIZE_GiB,  // gibibyte,
    SIZE_TiB,  // tebibyte,
    SIZE_PiB,  // pebibyte,
    // }
    // 国际单位制词头 {
    SIZE_KB,  // kilobyte,
    SIZE_MB,  // megabyte,
    SIZE_GB,  // gigabyte,
    SIZE_TB,  // terabyte,
    SIZE_PB,  // petabyte,
    // }
} unit_type_t;

typedef enum {
    CC_ALNUM,  // 字母以及数字
    CC_ALPHA,  // 字母
    CC_DIGIT,  // 数字
    CC_PRINT  // 可见字符
} char_classification_t;

// 文件或者目录状态
typedef struct {
    file_type_t type;  // 文件类型： 文件、目录 或 所有(文件和目录)
    string name;  // 文件名
    string ext;  // 文件扩展名，小写
    string path;  // 文件全路径
    byte_t bytes;  // 文件大小，单位字节(byte)。如果是目录，则为0
    time_t atime;  // 文件访问时间，秒
    time_t ctime;  // 文件状态修改时间，秒
    time_t mtime;  // 文件修改时间，秒
} file_stat_t;

#endif /* INCLUDE_ZPSOE_ZTYPES_H_ */
